{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 爬虫的正则方法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 正则方法爬取每页的标题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "14\n",
      "['XGBoost类库使用小结', 'XGBoost算法原理小结', '机器学习中的矩阵向量求导(五)矩阵对矩阵的求导', '机器学习中的矩阵向量求导(四)矩阵向量求导链式法则', '机器学习中的矩阵向量求导(三)矩阵向量求导之微分法', '机器学习中的矩阵向量求导(二)矩阵向量求导之定义法', '机器学习中的矩阵向量求导(一)求导定义与求导布局', '强化学习(十九)AlphaGoZero强化学习原理', '强化学习(十八)基于模拟的搜索与蒙特卡罗树搜索(MCTS)', '强化学习(十七)基于模型的强化学习与Dyna算法框架']\n",
      "['强化学习(十六)深度确定性策略梯度(DDPG)', '强化学习(十五)A3C', '强化学习(十四)Actor-Critic', '强化学习(十三)策略梯度(PolicyGradient)', '强化学习(十二)DuelingDQN', '强化学习(十一)PrioritizedReplayDQN', '强化学习（十）DoubleDQN(DDQN)', '强化学习（九）DeepQ-Learning进阶之NatureDQN', '强化学习（八）价值函数的近似表示与DeepQ-Learning', '强化学习（七）时序差分离线控制算法Q-Learning']\n",
      "['强化学习（六）时序差分在线控制算法SARSA', '强化学习（五）用时序差分法（TD）求解', '强化学习（四）用蒙特卡罗法（MC）求解', '强化学习（三）用动态规划（DP）求解', '强化学习（二）马尔科夫决策过程(MDP)', '强化学习（一）模型基础', '异常点检测算法小结', 'tensorflow机器学习模型的跨平台上线', '用PMML实现机器学习模型的跨平台上线', '用tensorflow学习贝叶斯个性化排序(BPR)']\n",
      "['贝叶斯个性化排序(BPR)算法小结', '特征工程之特征预处理', '特征工程之特征表达', '特征工程之特征选择', '用gensim学习word2vec', 'word2vec原理(三)基于NegativeSampling的模型', 'word2vec原理(二)基于HierarchicalSoftmax的模型', 'word2vec原理(一)CBOW与Skip-Gram模型基础', '条件随机场CRF(三)模型学习与维特比算法解码', '条件随机场CRF(二)前向后向算法评估标记序列概率']\n",
      "['条件随机场CRF(一)从随机场到线性链条件随机场', '用hmmlearn学习隐马尔科夫模型HMM', '隐马尔科夫模型HMM（四）维特比算法解码隐藏状态序列', '隐马尔科夫模型HMM（三）鲍姆-韦尔奇算法求解HMM参数', '隐马尔科夫模型HMM（二）前向后向算法评估观察序列概率', '隐马尔科夫模型HMM（一）HMM模型', 'EM算法原理总结', '用scikit-learn学习LDA主题模型', '文本主题模型之LDA(三)LDA求解之变分推断EM算法', '文本主题模型之LDA(二)LDA求解之Gibbs采样算法']\n",
      "['文本主题模型之LDA(一)LDA基础', '文本主题模型之非负矩阵分解(NMF)', '文本主题模型之潜在语义索引(LSI)', '英文文本挖掘预处理流程总结', '中文文本挖掘预处理流程总结', '文本挖掘预处理之TF-IDF', '文本挖掘预处理之向量化与HashTrick', '文本挖掘的分词原理', 'MCMC(四)Gibbs采样', 'MCMC(三)MCMC采样和M-H采样']\n",
      "['MCMC(二)马尔科夫链', 'MCMC(一)蒙特卡罗方法', '受限玻尔兹曼机（RBM）原理总结', 'LSTM模型与前向反向传播算法', '循环神经网络(RNN)模型与前向反向传播算法', '卷积神经网络(CNN)反向传播算法', '卷积神经网络(CNN)前向传播算法', '卷积神经网络(CNN)模型结构', '深度神经网络（DNN）的正则化', '深度神经网络（DNN）损失函数和激活函数的选择']\n",
      "['深度神经网络（DNN）反向传播算法(BP)', '深度神经网络（DNN）模型与前向传播算法', '分解机(FactorizationMachines)推荐算法原理', '用Spark学习矩阵分解推荐算法', 'SimRank协同过滤推荐算法', '矩阵分解在协同过滤推荐算法中的应用', '协同过滤推荐算法总结', '用Spark学习FPTree算法和PrefixSpan算法', 'PrefixSpan算法原理总结', 'FPTree算法原理总结']\n",
      "['Apriori算法原理总结', '典型关联分析(CCA)原理总结', '用scikit-learn研究局部线性嵌入(LLE)', '局部线性嵌入(LLE)原理总结', '奇异值分解(SVD)原理与在降维中的应用', '用scikit-learn进行LDA降维', '线性判别分析LDA原理总结', '用scikit-learn学习主成分分析(PCA)', '主成分分析（PCA）原理总结', '用scikit-learn学习谱聚类']\n",
      "['谱聚类（spectralclustering）原理总结', '用scikit-learn学习DBSCAN聚类', 'DBSCAN密度聚类算法', '用scikit-learn学习BIRCH聚类', 'BIRCH聚类算法原理', '用scikit-learn学习K-Means聚类', 'K-Means聚类算法原理', 'scikit-learn随机森林调参小结', 'Bagging与随机森林算法原理小结', 'scikit-learn梯度提升树(GBDT)调参小结']\n",
      "['梯度提升树(GBDT)原理小结', 'scikit-learnAdaboost类库使用小结', '集成学习之Adaboost算法原理小结', '集成学习原理小结', '支持向量机高斯核调参小结', 'scikit-learn支持向量机算法库使用小结', '支持向量机原理(五)线性支持回归', '支持向量机原理(四)SMO算法原理', '支持向量机原理(三)线性不可分支持向量机与核函数', '支持向量机原理(二)线性支持向量机的软间隔最大化模型']\n",
      "['支持向量机原理(一)线性支持向量机', '最大熵模型原理小结', 'scikit-learn朴素贝叶斯类库使用小结', '朴素贝叶斯算法原理小结', 'scikit-learnK近邻法类库使用小结', 'K近邻法(KNN)原理小结', 'scikit-learn决策树算法类库使用小结', '决策树算法原理(下)', '决策树算法原理(上)', '机器学习算法的随机数据生成']\n",
      "['感知机原理小结', '日志和告警数据挖掘经验谈', 'scikit-learn逻辑回归类库使用小结', '逻辑回归原理小结', 'scikit-learn线性回归算法库小结', '用scikit-learn和pandas学习Ridge回归', 'Lasso回归算法：坐标轴下降法与最小角回归法小结', '用scikit-learn和pandas学习线性回归', 'scikit-learn和pandas基于windows单机机器学习环境的搭建', '机器学习研究与开发平台的选择']\n",
      "['线性回归原理小结', '精确率与召回率，RoC曲线与PR曲线', '交叉验证(CrossValidation)原理小结', '最小二乘法小结', '梯度下降（GradientDescent）小结']\n"
     ]
    }
   ],
   "source": [
    "# 正则表达式解析xtml\n",
    "import requests  \n",
    "import re\n",
    "from lxml import etree# 解析html的库\n",
    "\n",
    "url = 'https://www.cnblogs.com/pinard/default.html?page={}'\n",
    "urls = [url.format(i) for i in range(1,15)]\n",
    "print(len(urls))  # 一共14页的数据\n",
    "\n",
    "# 获得每页的标题\n",
    "for url in urls:\n",
    "    response = requests.get(url)   # 请求\n",
    "    html_str = response.text\n",
    "    html_str = re.sub('\\s','',html_str)                                 # \\s匹配任意空白字符，等价于[\\t\\n\\r\\f]，该语法可用于将换行符、空格等去掉\n",
    "    title_pattern = r'postTitle2vertical-middle.*?<span>(.*?)</span>'   #  .表示任意字符，*表示任意多个字符,()里面是我提取的内容                                                  \n",
    "    result = re.findall(title_pattern,html_str,re.S)                    # re.S 使.匹配包括换行在内的所有字符 \n",
    "    print(result)  \n",
    "    # 在正则表达式中，\".“的作用是匹配任意字符，”\\n\"除外，也就是说，它只在一行内匹配，如果有换行那就不行了。\n",
    "    # 而re.S则很好的解决了这一个问题，re.S的作用\".“下的匹配规则扩展到整个字符串，包括换行符”\\n\"。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 正则方法爬取每篇的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "14\n",
      "['强化学习(十八)基于模拟的搜索与蒙特卡罗树搜索(MCTS)'] ['摘要：在强化学习(十七)基于模型的强化学习与Dyna算法框架中，我们讨论基于模型的强化学习方法的基本思路，以及集合基于模型与不基于模型的强化学习框架Dyna。本文我们讨论另一种非常流行的集合基于模型与不基于模型的强化学习方法：基于模拟的搜索(SimulationBasedSearch)。本篇主要参'] ['2019-03-0417:09'] ['26724'] ['22'] ['3']\n",
      "['强化学习（八）价值函数的近似表示与DeepQ-Learning'] ['摘要：在强化学习系列的前七篇里，我们主要讨论的都是规模比较小的强化学习问题求解算法。今天开始我们步入深度强化学习。这一篇关注于价值函数的近似表示和DeepQ-Learning算法。Deep&#160;Q-Learning这一篇对应Sutton书的第11章部分和UCL强化学习课程的第六讲。1.为何需要价值函数'] ['2018-09-2816:49'] ['45218'] ['179'] ['7']\n",
      "['用PMML实现机器学习模型的跨平台上线'] ['摘要：在机器学习用于产品的时候，我们经常会遇到跨平台的问题。比如我们用Python基于一系列的机器学习库训练了一个模型，但是有时候其他的产品和项目想把这个模型集成进去，但是这些产品很多只支持某些特定的生产环境比如Java，为了上一个机器学习模型去大动干戈修改环境配置很不划算，此时我们就可以考虑用预测模型标'] ['2018-06-2415:18'] ['33238'] ['67'] ['12']\n",
      "['条件随机场CRF(三)模型学习与维特比算法解码'] ['摘要：条件随机场CRF(一)从随机场到线性链条件随机场条件随机场CRF(二)前向后向算法评估标记序列概率条件随机场CRF(三)&#160;模型学习与维特比算法解码在CRF系列的前两篇，我们总结了CRF的模型基础与第一个问题的求解方法，本文我们关注于linear-CRF的第二个问题与第三个问题的求解。第二个问'] ['2017-06-2315:10'] ['20681'] ['61'] ['5']\n",
      "['文本主题模型之LDA(三)LDA求解之变分推断EM算法'] ['摘要：文本主题模型之LDA(一)LDA基础文本主题模型之LDA(二)LDA求解之Gibbs采样算法文本主题模型之LDA(三)LDA求解之变分推断EM算法本文是LDA主题模型的第三篇，读这一篇之前建议先读文本主题模型之LDA(一)LDA基础，同时由于使用了EM算法，如果你对EM算法不熟悉，建议'] ['2017-05-2212:20'] ['23283'] ['100'] ['10']\n",
      "['MCMC(四)Gibbs采样'] ['摘要：MCMC(一)蒙特卡罗方法MCMC(二)马尔科夫链MCMC(三)MCMC采样和M-H采样MCMC(四)Gibbs采样在MCMC(三)MCMC采样和M-H采样中，我们讲到了M-H采样已经可以很好的解决蒙特卡罗方法需要的任意概率分布的样本集的问题。但是M-H采样有两个缺点：一是需要计算接受率，在'] ['2017-03-3017:03'] ['61681'] ['116'] ['18']\n",
      "['深度神经网络（DNN）的正则化'] ['摘要：和普通的机器学习算法一样，DNN也会遇到过拟合的问题，需要考虑泛化，这里我们就对DNN的正则化方法做一个总结。1.DNN的L1&amp;L2正则化想到正则化，我们首先想到的就是L1正则化和L2正则化。L1正则化和L2正则化原理类似，这里重点讲述DNN的L2正则化。而DNN的L2正则化通常的做法是只针'] ['2017-02-2714:20'] ['30750'] ['40'] ['13']\n",
      "['PrefixSpan算法原理总结'] ['摘要：前面我们讲到频繁项集挖掘的关联算法Apriori和FPTree。这两个算法都是挖掘频繁项集的。而今天我们要介绍的PrefixSpan算法也是关联算法，但是它是挖掘频繁序列模式的，因此要解决的问题目标稍有不同。1.&#160;项集数据和序列数据首先我们看看项集数据和序列数据有什么不同，如下图所示。左边的'] ['2017-01-2023:13'] ['25390'] ['31'] ['4']\n",
      "['主成分分析（PCA）原理总结'] ['摘要：主成分分析（Principalcomponentsanalysis，以下简称PCA）是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA，下面我们就对PCA的原理做一个总结。1.PCA的思想PCA顾名思义，就是找出数据里最'] ['2016-12-3121:07'] ['149508'] ['221'] ['42']\n",
      "['Bagging与随机森林算法原理小结'] ['摘要：在集成学习原理小结中，我们讲到了集成学习有两个流派，一个是boosting派系，它的特点是各个弱学习器之间有依赖关系。另一种是bagging流派，它的特点是各个弱学习器之间没有依赖关系，可以并行拟合。本文就对集成学习中Bagging与随机森林算法做一个总结。随机森林是集成学习中可以和梯度提升树GB'] ['2016-12-1020:38'] ['99341'] ['157'] ['28']\n",
      "['支持向量机原理(五)线性支持回归', '支持向量机原理(四)SMO算法原理'] ['摘要：支持向量机原理(一)线性支持向量机支持向量机原理(二)线性支持向量机的软间隔最大化模型支持向量机原理(三)线性不可分支持向量机与核函数支持向量机原理(四)SMO算法原理支持向量机原理(五)线性支持回归在前四篇里面我们讲到了SVM的线性分类和非线性分类，以及在分类时用到的算法。这些都关注', '摘要：支持向量机原理(一)线性支持向量机支持向量机原理(二)线性支持向量机的软间隔最大化模型支持向量机原理(三)线性不可分支持向量机与核函数支持向量机原理(四)SMO算法原理支持向量机原理(五)线性支持回归在SVM的前三篇里，我们优化的目标函数最终都是一个关于$\\\\alpha$向量的函数。而怎'] ['2016-11-2916:53', '2016-11-2900:11'] ['29399', '59444'] ['41', '159'] ['10', '29']\n",
      "['决策树算法原理(上)'] ['摘要：决策树算法在机器学习中算是很经典的一个算法系列了。它既可以作为分类算法，也可以作为回归算法，同时也特别适合集成学习比如随机森林。本文就对决策树算法原理做一个总结，上篇对ID3，C4.5的算法思想做了总结，下篇重点对CART算法做一个详细的介绍。选择CART做重点介绍的原因是scikit-learn'] ['2016-11-1015:54'] ['96848'] ['133'] ['34']\n",
      "['scikit-learn和pandas基于windows单机机器学习环境的搭建'] ['摘要：很多朋友想学习机器学习，却苦于环境的搭建，这里给出windows上scikit-learn研究开发环境的搭建步骤。Step1.Python的安装python有2.x和3.x的版本之分，但是很多好的机器学习python库都不支持3.x，因此，推荐安装2.7版本的python。当前最新的pyth'] ['2016-10-3017:37'] ['10854'] ['7'] ['2']\n",
      "['最小二乘法小结'] ['摘要：最小二乘法是用来做函数拟合或者求函数极值的方法。在机器学习，尤其是回归模型中，经常可以看到最小二乘法的身影，这里就对我对最小二乘法的认知做一个小结。1.最小二乘法的原理与要解决的问题最小二乘法是由勒让德在19世纪发现的，原理的一般形式很简单，当然发现的过程是非常艰难的。形式如下式：$$目标函数'] ['2016-10-1912:31'] ['66085'] ['63'] ['44']\n"
     ]
    }
   ],
   "source": [
    "# 正则表达式解析xtml\n",
    "import requests  \n",
    "import re\n",
    "from lxml import etree# 解析html的库\n",
    "\n",
    "url = 'https://www.cnblogs.com/pinard/default.html?page={}'\n",
    "urls = [url.format(i) for i in range(1,15)]\n",
    "print(len(urls))  # 一共14页的数据\n",
    "\n",
    "# 获得每页的标题\n",
    "for url in urls:\n",
    "    response = requests.get(url)   # 请求\n",
    "    html_str = response.text\n",
    "    html_str = re.sub('\\s','',html_str) \n",
    "    blogs_pattern = r'<divclass=\"day\">(.*?)<divclass=\"day\"'\n",
    "    blogs = re.findall(blogs_pattern,html_str)\n",
    "    for blog in blogs:\n",
    "        title = re.findall(r'postTitle2vertical-middle.*?<span>(.*?)</span>',blog)                \n",
    "        abstract = re.findall(r'<divclass=\"c_b_p_desc\">(.*?)<ahref',blog)\n",
    "        date = re.findall(r'posted@(.*?)刘建平',blog)\n",
    "        read = re.findall(r'阅读\\((.*?)\\)',blog)\n",
    "        pinlun = re.findall(r'评论\\((.*?)\\)',blog) \n",
    "        tuijian = re.findall(r'推荐\\((.*?)\\)',blog)                     \n",
    "    print(title,abstract,date,read,pinlun,tuijian)  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 爬虫正则方法的局限性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "① 爬虫虽然有正则表达式的用法，但是一旦正则表达式写的有问题，得到的可能就不是我们想要的结果。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
